package com.qf.openapi2204.zuul.feignclient;

import com.qf.openapi2204.common.vo.ResultVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient("OPENAPI-CACHE")
public interface CacheClient {

    @GetMapping("/cache/get/{key}")
    public ResultVo get(@PathVariable("key") String key);

    @GetMapping("/cache/set/{key}/{value}/{second}")
    public ResultVo set(@PathVariable("key") String key ,@PathVariable("value") String value
            ,@PathVariable("second") Long second);

    @GetMapping("/cache/smembers/{key}")
    public ResultVo smembers(@PathVariable("key") String key);

    @GetMapping("/cache/sadd/{key}/{value}")
    public ResultVo sadd(@PathVariable("key") String key ,@PathVariable("value") String value);


    /**
     * 查询所有复合条件的key
     * @param keypattern key的模式
     * @return
     */
    @GetMapping("/cache/keys/{keypattern}")
    public ResultVo keys(@PathVariable("keypattern")  String keypattern);

    @GetMapping("/cache/set/{key}/{value}")
    public ResultVo set(@PathVariable("key") String key, @PathVariable("value") String value);

    /**
     * 操作 hash类型数据的接口，一次性写入多个 键值对到hash类型的key中
     *
     * 注意：这里第二个参数，没有使用缓存模块接口中声明的map类型，而是使用了Object类型
     * 目的是：方便调用该方法时，可以使用Object对象作为第二个参数 。
     * 由于feign调用，底层使用http协议，只要确保请求体中都是合法的json就可以调通缓存模块的接口
     * @return
     */
    @PostMapping("/cache/hmset/{key}")
    public ResultVo hmset(@PathVariable("key") String key, @RequestBody Object map);


    @GetMapping("/cache/hgetAll/{key}")
    public ResultVo hgetAll(@PathVariable("key") String key);

}
